SQL Server 运维常用sql语句(三)
查询返回当前配置的内存值和当前使用的值的相关信息
SELECT [name], [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)' OR [name] = 'min server memory (MB)';
修改内存的大小
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'max server memory (MB)', 4096; -- 设置最大内存限制为4GB
RECONFIGURE;
启用对表的压缩
EXEC sp_estimate_data_compression_savings 'Production', 'TransactionHistory', NULL, NULL, 'ROW';
ALTER TABLE Production.TransactionHistory REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW);
GO
启用索引压缩
SELECT name, index_id
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'TransactionHistory';
EXEC sp_estimate_data_compression_savings
@schema_name = 'Production',
@object_name = 'TransactionHistory',
@index_id = 2,
@partition_number = NULL,
@data_compression = 'PAGE';
ALTER INDEX IX_TransactionHistory_ProductID ON Production.TransactionHistory REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);
GO
读取错误日志
EXEC sp_readerrorlog 0, 1, 'database', 'start'
限制错误日志大小
USE [master];
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'ErrorLogSizeInKb', REG_DWORD, 5120;
GO
CHECKPOINT检查点
CHECKPOINT [ checkpoint_duration ]
查询是否有死锁
WITH CTE_SID ( BSID, SID, sql_handle )
AS ( SELECT blocking_session_id ,
session_id ,
sql_handle
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
UNION ALL
SELECT A.blocking_session_id ,
A.session_id ,
A.sql_handle
FROM sys.dm_exec_requests A
JOIN CTE_SID B ON A.SESSION_ID = B.BSID
)
SELECT C.BSID , C.SID , S.login_name , S.host_name , S.status ,S.cpu_time ,
S.memory_usage ,S.last_request_start_time , S.last_request_end_time ,S.logical_reads ,
S.row_count ,
q.text
FROM CTE_SID C
JOIN sys.dm_exec_sessions S ON C.sid = s.session_id
CROSS APPLY sys.dm_exec_sql_text(C.sql_handle) Q
ORDER BY sid
查看阻塞超时设置
SELECT @@LOCK_TIMEOUT
查看数据库的负载
SELECT substring (a.name,0,20) as [数据库名],
[连接数] = (SELECT COUNT(*) FROM master..sysprocesses b WHERE a.dbid = b.dbid), [阻塞进程] = (SELECT COUNT(*)
FROM master..sysprocesses b
WHERE a.dbid = b.dbid AND blocked <> 0),
[总内存] = ISNULL((SELECT SUM(memusage) FROM master..sysprocesses b WHERE a.dbid = b.dbid),0),
[总IO] = ISNULL((SELECT SUM(physical_io) FROM master..sysprocesses b WHERE a.dbid = b.dbid),0),
[总CPU] = ISNULL((SELECT SUM(cpu) FROM master..sysprocesses b
WHERE a.dbid = b.dbid),0), [总等待时间] = ISNULL((SELECT SUM(waittime)
FROM master..sysprocesses b
WHERE a.dbid = b.dbid),0) FROM master.dbo.sysdatabases a WITH (nolock)
WHERE DatabasePropertyEx(a.name,'Status') = 'ONLINE'
ORDER BY [数据库名]
整理索引碎片
第 一步:查询表的索引碎片情况
DBCC SHOWCONTIG WITH ALL_INDEXES;
第二步:删除并重建索引
第三步:使用DROP_EXISTING子句重建索引
第四步:执行DBCC DBREINDEX
第五步:执行DBCC INDEXDEFRAG
Select 'DBCC INDEXDEFRAG ('+DB_Name()+','+Object_Name(ID)+','+Cast(INDID As Varchar)+')'+Char(10)
From SysIndexes
Where ID Not IN (Select ID From SYSObjects Where xType='S')
查询索引
SELECT CASE WHEN t.[type] = 'U' THEN'表'
WHEN t.[type] = 'V' THEN '视图' END AS '类型',
SCHEMA_NAME(t.schema_id) + '.' + t.[name] AS '(表/视图)名称',
i.[name] AS 索引名称,
SUBSTRING(column_names, 1, LEN(column_names) - 1) AS '列名',
CASE WHEN i.[type] = 1 THEN '聚集索引'
WHEN i.[type] = 2 THEN '非聚集索引'
WHEN i.[type] = 3 THEN 'XML索引'
WHEN i.[type] = 4 THEN '空间索引'
WHEN i.[type] = 5 THEN '聚簇列存储索引'
WHEN i.[type] = 6 THEN '非聚集列存储索引'
WHEN i.[type] = 7 THEN'非聚集哈希索引'
END AS '索引类型',
CASE WHEN i.is_unique = 1 THEN'唯一' ELSE '不唯一' END AS '索引是否唯一'
FROM sys.objects t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
CROSS APPLY
(
SELECT col.[name] + ', '
FROM sys.index_columns ic
INNER JOIN sys.columns col
ON ic.object_id = col.object_id
AND ic.column_id = col.column_id
WHERE ic.object_id = t.object_id
AND ic.index_id = i.index_id
ORDER BY col.column_id
FOR XML PATH('')
) D(column_names)
WHERE t.is_ms_shipped <> 1
AND index_id > 0
ORDER BY i.[name];